# https://bbs.quantclass.cn/thread/57832  该因子用在轮动空头上，效果一般。跑轮动可以不用该因子
def signal(candle_df, param, *args):
    """
    计算 BIAS 因子，并生成信号
    """
    # 确保参数转换为正确类型
    try:
        n = int(param[0])  # 强制转换为整数
        threshold = float(param[1])  # 强制转换为浮点数
    except (TypeError, ValueError):
        # 类型转换失败时使用默认值
        n = 240  # 默认值 240小时(10天)
        threshold = -0.15

    factor_name = args[0]

    # 检查输入有效性
    if 'close' not in candle_df.columns:
        raise ValueError("价格列close不存在于DataFrame中")
    if n <= 0:
        n = 240  # 提供默认值

    # 计算 BIAS 指标
    ma = candle_df['close'].rolling(window=n, min_periods=1).mean()
    bias = (candle_df['close'] - ma) / ma

    # 生成信号
    signal_condition = (bias >= threshold) & (bias <= 0)
    candle_df[factor_name] = signal_condition.astype(int)  # 转换为整数类型

    return candle_df
